<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型机制</title>
</head>
<body>
    
</body>
<script>
    //constructor在prototype里
    var o1={};//json
    var o2=new Object();
    var o3=new Hero();
    function Hero(){    //普通
        console.log("f1");
    }
    console.log(typeof o1); //  obj
    console.log(typeof o2); //  obj
    console.log(typeof o3); //  obj
    var f2=function(){console.log("f2");};    //匿名
    var f3=new Function(alert(666));
    console.log(typeof Hero); //  function
    console.log(typeof f2); //  function
    console.log(typeof f3); //  function
    //实例的构造函数属性(constructor)指向构造函数
    function Stu(na,age){
        this.name=na;
        this.age=age;
        this.hi=function(){
            console.log("我叫:"+this.name+"年龄:"+this.age);
        }
    }
    var lei=new Stu("Mr_xiao",17);
    var tao=new Stu("涛涛",18);
    console.log(lei.constructor==Stu);   //true 指向类本身
    console.log(tao.constructor==Stu);   //true
    console.log(lei==tao);  //false
    console.log(Stu.prototype);//指向函数的原型对象
    //由原型对象给类增加属性和方法
    Stu.prototype.banname='终极一班';
    Stu.prototype.game=function(){
        alert(this.name+"打游戏....")
    }
    console.log(lei.banname);
    console.log(tao.banname);
    lei.game()  //调用game方法OK

    console.log(Stu.prototype.constructor==Stu);//true
    

     var o1={}//json
    console.log(o1.prototype);  //undefined  类原型    prototype给类用
    console.log(o1.constructor);    //object  每个对象都有    constructor给对象用


    /*
    实质上,函数对象的prototype属性就是一个对象,这个对象会自动带有一个constructor属性,该属性就是Stu函数本身,即
    Stu.prototype.constructor==Stu
    */

   //__proto__
   /*
   Js在创建对象(不论使普通对象还使函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的构造函数的原型对象
   */
    console.log(Stu.prototype==lei.__proto__);//true    类指向类原型
    console.log(lei.__proto__); //对象指向类原型
</script>
</html>